home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 351-375 / disk_360 / uucp / uucp0.lzh / src / util / uusplit.c < prev    next >
C/C++ Source or Header  |  1990-05-27  |  3KB  |  150 lines

  1.  
  2. /*
  3.  *  UUSPLIT.C
  4.  *
  5.  *  uusplit file [outprefix] [-b #bytes] [-v]
  6.  *
  7.  *  $Header: Beta:src/uucp/src/MUtil/RCS/uusplit.c,v 1.1 90/03/19 14:06:36 dillon Exp Locker: dillon $
  8.  *
  9.  *  take the binary 'file' and split into sections of 50KBytes each, uuencoding
  10.  *  each section independantly.  Result:
  11.  *
  12.  *    outprefix.01.uue,   outprefix.02.uue ,etc...  uuencoding
  13.  *    outprefix.01,        outprefix.02, etc...
  14.  *
  15.  *  File segments are uuencoded.  uuencode must be in your path.    Calculate
  16.  *  a 1.5 expansion uuencoding the file.
  17.  */
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include "version.h"
  22.  
  23. IDENT(".00");
  24.  
  25. Local void DumpSegment(FILE *, short, long, char *);
  26. Local void run_cmd(char *);
  27. Local void help(void);
  28.  
  29. short    Verbose;
  30.  
  31. main(ac, av)
  32. char *av[];
  33. {
  34.     long bytes = 50000;
  35.     short i;
  36.     char *file    = NULL;
  37.     char *outpf = NULL;
  38.     FILE *fi;
  39.     long size;
  40.     long n;
  41.  
  42.     for (i = 1; i < ac; ++i) {
  43.     char *ptr = av[i];
  44.     if (*ptr == '-') {
  45.         ptr += 2;
  46.         switch(ptr[-1]) {
  47.         case 'v':
  48.         Verbose = 1;
  49.         break;
  50.         case 'b':
  51.         if (*ptr)
  52.             bytes = atoi(ptr);
  53.         else
  54.             bytes = atoi(av[++i]);
  55.         break;
  56.         default:
  57.         help();
  58.         }
  59.     } else {
  60.         if (file == NULL)
  61.         file = ptr;
  62.         else if (outpf == NULL)
  63.         outpf = ptr;
  64.         else
  65.         help();
  66.     }
  67.     }
  68.  
  69.     bytes = bytes * 2 / 3;    /*  assume uuencode expands file 1.5x    */
  70.  
  71.     if (file == NULL)
  72.     help();
  73.     if (outpf == NULL)
  74.     outpf = file;
  75.  
  76.     fi = fopen(file, "r");
  77.     if (fi == NULL) {
  78.     printf("couldn't open %s\n", file);
  79.     exit(1);
  80.     }
  81.     fseek(fi, 0L, 2);
  82.     size = ftell(fi);
  83.     for (i = n = 0; n < size; n += bytes) {
  84.     long b = size - n;
  85.  
  86.     if (b > bytes)
  87.         b = bytes;
  88.     fseek(fi, n, 0);
  89.     DumpSegment(fi, (short)(i + 1), b, outpf);
  90.     ++i;
  91.     }
  92.     fclose(fi);
  93.     return(0);
  94. }
  95.  
  96. void
  97. help()
  98. {
  99.     puts("uusplit file [outprefix] [-b bytes] [-v]");
  100.     exit(1);
  101. }
  102.  
  103. void
  104. DumpSegment(fi, i, bytes, outprefix)
  105. FILE *fi;
  106. short i;
  107. long bytes;
  108. char *outprefix;
  109. {
  110.     static char Name1[256];
  111.     static char Name2[256];
  112.     static char Name3[256];
  113.     static char Buf[4096];
  114.     long n;
  115.     FILE *fo;
  116.  
  117.     sprintf(Name1, "T:uusplit.%02d", i);
  118.     sprintf(Name2, "%s.%02d", outprefix, i);
  119.     sprintf(Name3, "%s.%02d.uue", outprefix, i);
  120.  
  121.     fo = fopen(Name1, "w");
  122.     if (fo == NULL) {
  123.     printf("couldn't create %s\n", Name1);
  124.     exit(1);
  125.     }
  126.  
  127.     while (bytes) {
  128.     n = (bytes > sizeof(Buf)) ? sizeof(Buf) : bytes;
  129.     fread(Buf, 1, n, fi);
  130.     fwrite(Buf, 1, n, fo);
  131.     bytes -= n;
  132.     }
  133.     fclose(fo);
  134.     sprintf(Buf, "uuencode >%s %s %s", Name3, Name1, Name2);
  135.     run_cmd(Buf);
  136.     remove(Name1);
  137. }
  138.  
  139. void
  140. run_cmd(buf)
  141. char *buf;
  142. {
  143.     if (Verbose) {
  144.     puts(buf);
  145.     fflush(stdout);
  146.     }
  147.     Execute(buf, NULL, NULL);
  148. }
  149.  
  150.